/*
 * PROJETMUNCHKINApp.java
 */
package InterfaceGraphique;

import InterfaceGraphique.exceptions.TropDeCarteException;
import InterfaceGraphique.popupChoix.FenChoixClasses;
import InterfaceGraphique.popupChoix.FenChoixJoueur;
import cartes.Carte;
import cartes.Monstre;
import java.awt.Container;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import plateau.Joueur;
import plateau.Partie;
import common.Constantes;
import comportement.ActionPerdreClasse;
import java.awt.Image;
import java.util.ArrayList;


/* A FAIRE 
 * bug mourir
 * defausser carte fonctionne pas 
 * niveau 0 -> mort
 */




/**
 * The main class of the application.
 */
public class MainApplication extends JFrame {

    //Fenetres principales du jeu
    public static HashMap<Integer, JFrame> fenetres;
    private static int joueurEnCours = 0;
    //Tailles de la fenetre pirncipale en pixels
    private static final int width = 1024;
    private static final int height = 768;

    

    

         
    @Override
    public void setContentPane(Container contentPane) {
            super.setContentPane(contentPane); 
    }

    public static void DefinirFondFenetre(JFrame Fenetre, Image Fond, ImagePanel panelFond)
    {
        panelFond = new ImagePanel(Fond);
        Fenetre.setContentPane(panelFond);
    }
  



    /**
     * At startup create and show the main frame of the application.
     */
    public static void main(String[] args) throws ClassNotFoundException {

        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(FenAccueil.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(FenAccueil.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(FenAccueil.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(FenAccueil.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        fenetres = new HashMap<Integer, JFrame>();

        //Initialisation des fenêtres principales du jeu
        FenAccueil fenAccueil = new FenAccueil();
        FenNouvPartie fenCreerPartie = new FenNouvPartie();
        FenJeuEntrer fenJeuEntrer = new FenJeuEntrer();
        FenCombatDefaite fenCombatDefaite = new FenCombatDefaite();
        FenLancementDe fenLancementDe = new FenLancementDe();
        FenChoixJoueur fenChoixJoueur = new FenChoixJoueur();
        FenFinPartie fenFinPartie = new FenFinPartie();
        FenMort fenMort = new FenMort();
        //FenFinPartie fenPrefJoueurs = new FenPrefJoueurs();
 
        PopupApropos fenPopup = new PopupApropos();


        fenetres.put(Constantes.FEN_ACCUEIL, fenAccueil);
        fenetres.put(Constantes.FEN_CREER, fenCreerPartie);
        fenetres.put(Constantes.FEN_JEU_ENTRER, fenJeuEntrer);
        fenetres.put(Constantes.FEN_COMBAT_DEFAITE, fenCombatDefaite);
        fenetres.put(Constantes.FEN_LANCEMENT_DE, fenLancementDe);
        fenetres.put(Constantes.FEN_FIN_PARTIE, fenFinPartie);
       
        fenetres.put(Constantes.FEN_POPUP_A_PROPOS, fenPopup);
        fenetres.put(Constantes.FEN_CHOIXJOUEUR, fenChoixJoueur);
        fenetres.put(Constantes.FEN_FIN_PARTIE, fenFinPartie);
        fenetres.put(Constantes.FEN_MORT, fenMort);
        
       // fenetres.put(Constantes.FEN_PREFERENCES_JOUEURS, fenPrefJoueurs);

       


        // Affichage de la fenetre principale
        showFenAccueil();
    }

    public static void showCreatpartie() {
        hideAll();
        fenetres.get(Constantes.FEN_CREER).setVisible(true);
    }

    public static void showPrefJoueurs()
    {
        FenChangementPreferencesJoueurs.Initialisation();
        fenetres.get(Constantes.FEN_PREFERENCES_JOUEURS).setVisible(true);
    }

    
    public static void ChargerPartie()
    {
        try {
            hideAll();
            Partie.charger();
        } catch (IOException ex) {
            Logger.getLogger(MainApplication.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        fenetres.get(Constantes.FEN_JEU_ENTRER).setVisible(true);
        
    }
    
    public static void enregistrerPartie()
    {
       Partie.sauvegarder(); 
    }
            
    public static void showPopup() {
        fenetres.get(Constantes.FEN_POPUP_A_PROPOS).setVisible(true);
    }

    public static void showFenAccueil() {
        hideAll();
        fenetres.get(Constantes.FEN_ACCUEIL).setVisible(true);
    }

    public static void showJeuCharge()
    {
        fenetres.get(Constantes.FEN_JEU_ENTRER).setVisible(true);
    }


    public static void lancerPartie(ArrayList<Joueur> listeJoueurs) {
        Partie.create(listeJoueurs);
        Partie.lancerPartie();
        hideAll();
        MainApplication.tourDeJeu(Partie.getListeJoueurs().get(joueurEnCours));
    }

    public static void show(int fen) {        
        fenetres.get(fen).setVisible(true);
    }
    
    public static void hide(int fen) {        
        fenetres.get(fen).setVisible(false);
    }

    public static JFrame getFenetre(int fen) {
        return fenetres.get(fen);
    }
    
    public static void hideAll() {
        for (Map.Entry<Integer, JFrame> j : ((HashMap<Integer, JFrame>) fenetres).entrySet()) {
            j.getValue().setVisible(false);
        }
    }

    public static void exit() {
        System.exit(0);
    }

    public static void tourDeJeu(Joueur j) {
        ((FenJeuEntrer) fenetres.get(Constantes.FEN_JEU_ENTRER)).setJoueur(j);
        fenetres.get(Constantes.FEN_JEU_ENTRER).setVisible(true);
    }

    // fenetre de victoire d'un combat
    public static void showWinCombat(ArrayList<Carte> c, int nbNiveaux) {
        ((FenJeuEntrer) fenetres.get(Constantes.FEN_JEU_ENTRER)).showCombatVictoire(c, nbNiveaux);
    }

 // fenetre de fin d'un combat
    public static void endCombat() {
        FenJeuEntrer fen = (FenJeuEntrer) fenetres.get(Constantes.FEN_JEU_ENTRER);

        fen.setVisible(true);
        fen.combatTermine(getJoueurEnCours());
    }

    public static void endAction() {
        FenJeuEntrer fen = (FenJeuEntrer) fenetres.get(Constantes.FEN_JEU_ENTRER);
        FenChoixJoueur fen2 = (FenChoixJoueur) fenetres.get(Constantes.FEN_CHOIXJOUEUR);
        fen.upCartes(getJoueurEnCours());
        fen2.setVisible(false);
        //hideAll();
        fen.setVisible(true);
    }
    
    //perte d'un combat

     // fenetre de defaite d'un combat
    public static void showPerteCombat(Monstre m) {
        ((FenJeuEntrer) fenetres.get(Constantes.FEN_JEU_ENTRER)).showPertCombat(m);
        /*FenCombatDefaite fenCombatDefaite = new FenCombatDefaite();
        
        FenCombatDefaite f = (FenCombatDefaite) fenetres.get(Constantes.FEN_COMBAT_DEFAITE);
        //load de la fenetre combat defaite
        f.load(m);
        //hide(Constantes.FEN_COMBAT_DEBUT);
        show(Constantes.FEN_COMBAT_DEFAITE);*/

    }

     //affichage de combat défaite suite au lancé de dé.
      public static void showPerteCombat2() {
   
        
        FenCombatDefaite f = (FenCombatDefaite) fenetres.get(Constantes.FEN_COMBAT_DEFAITE);
        hide(Constantes.FEN_LANCEMENT_DE);
        show(Constantes.FEN_COMBAT_DEFAITE);

    }
    
    //lancement du dé et appel de la fenetre lancement du dé
    public static void lancementDe(int resultat){
        
        FenLancementDe fenLancementDe = new FenLancementDe();
        
        FenLancementDe f = (FenLancementDe) fenetres.get(Constantes.FEN_LANCEMENT_DE);
        show(Constantes.FEN_LANCEMENT_DE);
        f.load(resultat);
    }

    public static void showChoixJoueur(Carte c) {
        FenChoixJoueur f = (FenChoixJoueur) fenetres.get(Constantes.FEN_CHOIXJOUEUR);
        f.load(c);
        f.setVisible(true);
    }

    public static void finTour() throws TropDeCarteException {
        if( getJoueurEnCours().tropDeCarte() )
            throw new TropDeCarteException("Vous ne pouvez pas avoir plus de " + getJoueurEnCours().getNbMainDispo() + "en main à la fin du tour.");

        MainApplication.nextJoueur();
        if (MainApplication.getJoueurEnCours().isEstmort()){
            MainApplication.getJoueurEnCours().commencerPartie(MainApplication.getJoueurEnCours());            
        }
        
        MainApplication.tourDeJeu(MainApplication.getJoueurEnCours());
        
    }
    
    public static void gagnerPartie() {
        if( getJoueurEnCours().getNiveau() >= 10 )
        {
            FenFinPartie f = (FenFinPartie) fenetres.get(Constantes.FEN_FIN_PARTIE);
            
            f.setVisible(true);
            f.load(getJoueurEnCours());
        }
        
    }
    
    public static void JoueurMourir(Joueur j) {
      
            //FenMort fenMort = new FenMort();
            FenMort f = (FenMort) fenetres.get(Constantes.FEN_MORT);
            f.load(j);
            f.setVisible(true);
            
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
        
    }

    /*
     * Getter & Setter
     */

    /* public FenetreCreationPartie getFEN_CreationPartie() {
    return fenCreerPartie;
    }

    public void setFEN_CreationPartie(FenetreCreationPartie FEN_CreationPartie) {
    this.fenCreerPartie = FEN_CreationPartie;
    }*/
    public int getHeight() {
        return height;
    }

    public int getWidth() {
        return width;
    }

    public static Joueur getJoueurEnCours() {
        return Partie.getListeJoueurs().get(joueurEnCours);
    }

    public static void setJoueurEnCours(int joueurEnCours) {
        MainApplication.joueurEnCours = joueurEnCours;
    }
    
    public static int nextJoueur() {
        MainApplication.joueurEnCours = (MainApplication.joueurEnCours + 1) % Partie.getListeJoueurs().size();
        return MainApplication.joueurEnCours;
    }
    
    public static void choisirClasse(Joueur j, ActionPerdreClasse act) {
        FenChoixClasses f = new FenChoixClasses();
        f.load(act, j, j.getInventaire().getCartesClasse());
    }
    public static void showPopupError(String message) {
        new BoiteMessage(message);
    }
}
